package com.wang.spring;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcTemplateDemo  {
/*
 继承JdbcDaoSupport，也可以直接获取jdbcTempldate对象，  

queryFor* 方法很好用，简单强大。
 
query查询方法中带有回调接口有三个：
ResultSetExtractor: 一般是直接new ResultSetExtractor()，然后在extractData(ResultSet rs)方法中实现自己的内容，最后返回Object结果。
RowCallbackHandler: 也是new RowCallbackHandler()，然后在processRow(ResultSet rs), 方法中实现自己代码，并且将内容保存在上下文变量中，因为此方法没有返回类型（void）
RowMapper: new RowMapper(), 然后在mapRow(ResultSet rs, int rowNum)实现自己代码，并返回Object结果。  

ResultSetExtractor一次处理多个结果，而RowCallbackHandler、RowMapper只处理单行结果
 
 */
	@Autowired
	@Qualifier("jdbcTemplate")
	private JdbcTemplate jdbcTemplate;	
	
	
//	public JdbcTemplateDemo(){
//		//JdbcDaoSupport 可以直接给我恩提供获取jdbcTemplate方法，
//		jdbcTemplate = getJdbcTemplate();
//	}
	
	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	@Autowired
	private DataSource dataSource;
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	
	public void query1(){
		String sql = "select * from userinfo where username=?";
		jdbcTemplate.execute(sql, new PreparedStatementCallback<Object>(){
			@Override
			public Object doInPreparedStatement(PreparedStatement ps)
					throws SQLException, DataAccessException {
				ps.setString(1, "simon");
				ResultSet rs = ps.executeQuery();
				String result = "";
				while(rs.next()){
					result = rs.getString("username");
				}
				System.out.println(result);
				return result;				
			}
		});
	}
	
	
	public void query2(){
		String sql = "select * from userinfo where username=?";
		jdbcTemplate.query(sql, 
		    new PreparedStatementSetter(){
				@Override
				public void setValues(PreparedStatement ps) throws SQLException {
					ps.setString(1, "simon");
				}
		    },
		    new ResultSetExtractor<Object>() {
		    	@Override
		    	public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
		    		List list = new ArrayList();
		    		while(rs.next()){
		    			list.add(rs.getString("username"));
		    		}
		    		System.out.println(list);
		    		return list;		    	
		    	}
			});
	}
	
	
	
//	查询单行记录，建议实现 RowMapper 接口来创建自定义的RowMapper
	public UserInfo findUserByName(){
		String sql = "SELECT * FROM USERINFO WHERE USERNAME=? ";
		return jdbcTemplate.queryForObject(sql, new Object[]{"simon"}, new UserInfoRowMapper());		
	}
	
	
	//查询多行
	public List<UserInfo> findAll(){
		String sql = "SELECT * FROM USERINFO";
		List<Map<String,Object>> rows = jdbcTemplate.queryForList(sql);
		List<UserInfo>  list = new ArrayList<UserInfo>();
		for(Map map : rows){
			UserInfo user = new UserInfo();
			user.setUsername(String.valueOf(map.get("username")));
			user.setPassword(String.valueOf(map.get("password")));
			user.setUserRole(String.valueOf(map.get("user_role")));
			list.add(user);
		}
		return list;		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
